package day07.DataTime_demo;

import org.junit.Test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/*
* 代码解析
Date date = new Date();  // 1. 创建一个表示当前日期时间的Date对象

// 2. 创建日期格式化对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

// 3. 将Date对象格式化为指定格式的字符串
String rqstr = sdf.format(date);
*
* */



/*
1. 外层循环结构
for (int i = 0; i < 50; i++) {
        // 线程创建逻辑
        }
作用：创建50个线程模拟并发场景
问题：直接循环创建线程是低效方式，应该使用线程池（如Executors.newFixedThreadPool()）

2. 线程创建方式
new Thread(()->{  任务逻辑  }).start();
立即启动线程（start()）

3. 共享资源访问
Date dt = sdf.parse(rqstr);  // 多线程共享SimpleDateFormat
System.out.println("dt---"+dt);
关键问题点：
sdf（SimpleDateFormat）被所有线程共享
parse()方法非线程安全（修改内部Calendar状态）
System.out也是共享资源（可能阻塞）
*/



public class DataTimeTest {
    @Test
    public void test(){
        Date date  =new Date();

        SimpleDateFormat simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd");

//        格式化日期：Date ------> 字符串
        String stringDate= simpleDateFormat.format(date);

        for (int i = 0; i < 50; i++) {
//            new Thread( () -> { } ).start();
            new Thread( () -> {
                SimpleDateFormat localSdf= new SimpleDateFormat("yyyy-MM-dd");
                try {
//                    解析日期：字符串 ------> Date
                    Date date1=localSdf.parse(stringDate);
                    System.out.println("date1:  "+date1);
                } catch (ParseException e) {
                    System.err.println("解析时间日期失败"+stringDate);
                    e.printStackTrace();
                }
            } ).start();
        }
    }

//    计算时间差
    @Test
    public void test1(){
        LocalTime now = LocalTime.now();
        System.out.println("now localtime: "+now);

        LocalTime mytime = LocalTime.of(22,56,36);
        System.out.println("my time: "+mytime);

        Duration duration = Duration.between(now, mytime);

        System.out.println("hours: "+duration.toHours());
        System.out.println("minutes: "+duration.toMinutes());
        System.out.println("seconds: "+duration.toSeconds());
    }


//    计算日期差
    @Test
    public void test2(){
        LocalDate now_localDate= LocalDate.now();
        System.out.println("now localdate: "+now_localDate);

        LocalDate my_localdate= LocalDate.of(2028,6,9);
        System.out.println("mylocaldate: "+my_localdate);

        Period period= Period.between(now_localDate,my_localdate);

        System.out.println("years: "+period.getYears());
        System.out.println("months: "+period.getMonths());
        System.out.println("days: "+period.getDays());
    }

    @Test
    public void test3(){
        LocalDateTime localDateTime= LocalDateTime.now();
        System.out.println("now localdatetime: "+localDateTime);

//         格式化： 日期 ---> 字符串
//        JDK自带的日期时间格式化
        DateTimeFormatter dateTimeFormatter= DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        System.out.println("格式化后的日期字符串： "+localDateTime.format(dateTimeFormatter));

//        指定日期时间的格式
        DateTimeFormatter dateTimeFormatter1= DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
//        解析： 字符串 --->  日期
        LocalDateTime parse= LocalDateTime.parse("2028年06月09日 16时33分56秒",dateTimeFormatter1);
        System.out.println("解析后的日期： "+parse);

//        多线程解析
        for (int i = 0; i < 50; i++) {
            new Thread( () -> {
                /*
                * parse1 并不是「重新写了一个方法」，而是在多线程任务里重新调用 LocalDateTime.parse，
                * 目的是给每个线程一份独立的解析结果，避免共享同一个 parse 变量带来的线程安全问题
                * */
                LocalDateTime parse1= LocalDateTime.parse("2025年06月09日 16时33分56秒",dateTimeFormatter1);
                System.out.println(parse1);
            } ).start();
        }
    }


    @Test
    public void test4(){
        LocalDate localDate= LocalDate.now();
        LocalTime localTime= LocalTime.now();
        LocalDateTime localDateTime= LocalDateTime.now();

        System.out.println("year:  "+localDateTime.getYear());
        System.out.println("month: "+localDateTime.getMonth());
        System.out.println("day: "+localDateTime.getDayOfMonth());
        System.out.println("hour: "+localDateTime.getHour());
    }




}
